Lectured by HUNG-YI LEE (李宏毅) Recorded by Yusheng zhao(yszhao0717@gmail.com


Lecture 5:Transformer应用场景TTS:Seq2seq for Chatbot:其他NLP应用场景:Seq2seq for Syntactic ParsingSeq2seq for Multi-label ClassificationSeq2seq for Object Detection综上 seq2seq很powerfulSeq2seq的具体实现EncoderDecoder比较常见的一种:Autoregressive(AT) Encoder和Decoder是如何传输资讯的呢?训练seq2seq模型的tipsCopy MechanismGuided AttentionBeam Search:集束搜索

Lecture 5:Transformer


transformer和BERT很有关系

transformer就是一个Sequence-to-sequence(Seq2seq)的模型。这里可以回顾下Lecture 4讲到的致力于解决输入为一组向量的深度学习任务的分类,其中模型自己决定label的数量——seq2seq任务(Input a sequence, output a sequence, the output length is determined by model)

应用场景

举例来说,语音识别机器翻译语音翻译(世界是许多语言没有文字,所以需要直接从语音翻译)Text-to-Speech(TTS)Synthesis(输入文字,输出语音)seq2seq for Chatbot:聊天机器人

TTS:

Seq2seq for Chatbot:

其他NLP应用场景:

问题,文章==>答案。参考实例:文章1文章2

强调一下:对于多数的NLP问题或对多数的语音相关的任务而言,往往为这些任务客制化模型,会得到更好的结果。举例来说,Google的pixel4用的N to N的network用了一个RNN transducer的model来完成语音识别任务,模型设计针对了语音的特性,那么对于相关语音任务表现会更好。

Seq2seq for Syntactic Parsing

文法剖析任务,输入一段sequence,输出一个文法剖析树

一篇文章grammar as a foreign language介绍了这个做法。用原来只用在翻译的Seq2seq的model来做文法剖析(故名为文法当作另一门“语言”,所以是硬用seq2seq)

Seq2seq for Multi-label Classification

Multi-label Classification:同一个东西可以属于多个class。

由于每个东西可能所属类的数量种类有所不同,所以如果只是设置一个threshold(比方说取前三名)效果可能非常不好。然而这里可以用seq2seq硬做,机器自己决定输出几个class。

参考实例:文章1文章2

Seq2seq for Object Detection

参考文章

综上 seq2seq很powerful

Seq2seq的具体实现

如上图,把输入sequence丢进Encoder,然后再扔进Decoder,由Decoder决定输出什么样的sequence。之后会细讲Encoder和Decoder的内部架构。

经典的seq2seq架构👇

这节的主角Transformer👇


Encoder

作用:input一排向量输出另外一排向量。上一个lecture讲的self-attention以及之前的RNN和CNN都能做到,而在Transformer里面的Encoder用的是self-attention

把Encoder内部肢解出来,在Transformer里面👇

Encoder的关键是许多个Block,每个Block有好几个Layer在工作,每个Block整合了一系列的操作(self-attention + FC):首先是输入进self-attention以考虑到整个sequence的资讯,output另外一排vector;然后把这排vector再丢进fully connected的feed forward network里面,再output另外一排vector——即Block的输出。

在原来的Transformer里面,做的事情更复杂:

在Transformer里面,在输出的vector还要加上对应的input,包含这种形式的架构称之为Residual connection;接着把结果做Layer normalization(相较于batch normalization更简单些)。这个输出才是FC的输入,然后再做一次residual connection和layer normalization。

上图中的Add & Norm就是residual connection加上layer normalization;Positonal Encoding和Multi-Head Attention之前讲过。

BERT其实就是Transformer的Encoder。

上述是原始论文的Transformer设计,相关的深入探讨:On Layer Normalization in the Transformer ArchitecturePowerNorm: Rethinking Batch Normalization in Transformers

也有Transformer的魔改版本:(a)是原始的,(b)是其中一个魔改(更换了Layer Norm顺序...)


Decoder

Decoder其实有两种

比较常见的一种:Autoregressive(AT)

Speech Recognition(输入一段声音,输出一段文字) as example,说明AT如何运作

Decoder读入Encoder的输出(某种方法),产生语音识别的结果。Decoder如何产生一段文字?


Encoder和Decoder是如何传输资讯的呢?

方才比较Encoder和Decoder的结构时,Decoder被马赛克的一块👇

这个结构称之为Cross Attention。这个模组实际上是如下运作的:

Decoder会先读进start的一个token,其中的self-attention是mask的,得到一个向量,做transform,乘以一个矩阵得到一个。同时Encoder会依照self-attention产生由此计算得到。这个步骤称之为Cross Attention。(来自Decoder,来自Encoder)之后的计算和self-attention类似,得到加权值在输入全连接层中。

来自ICASS的文章Listen, attend and spell: A neural network for large vocabulary conversational speech recognition——seq2seq硬做语音识别,稍逊于SOTA。有趣的是,这里已经出现attention的机制,是先有cross attention再有self-attention。

attention分数较高的部分几乎就是从左往右偏移(mode至上而下)。

原论文中会用Encoder最后一层输出作为最终输出,也可以不这样,多一些另外新的想法,也有人尝试不同的cross-attention,例如文章。这里也可以是一个研究问题。


语音识别任务在实际的train下,我们希望distribution的概率值要和ground truth(通常就是one-hot vector)越接近越好(两者做cross entropy得到的值越小越好),这玩意和分类很像,每次在通过一段语音产生一个中文字的过程都像是一个分类过程。每次“分类”都会计算一次cross entropy,每次总和起来的entropy期望其越来越小。注意到还有有END和START的特殊字符,那么这个位置的distribution值应当与对应特殊字符的one-hot的cross-entropy越小越好。另外,在训练的时候Decoder会输入ground truth而非我们之前所提到的前一个distribution——这件事叫做Teacher Forcing:using the ground truth as input。

但是test的时候,显然不能把正确答案input进去,这时候decoder只能看到自己的输入和输出,这中间显然有一个Mismatch。

这两者的mismatch的现象称之为exposure bias,怎么解决(缓解)呢?直接在Decoder的输入加一点noise,它反而会学的更好。

训练seq2seq模型的tips
Copy Mechanism

让Decoder从输入“复制”一些东西进来当作输出,比如聊天机器人👇

还有比如说做摘要(Summarization)任务,参考文献

最早从输入复制东西当输出的一部分的模型叫做Pointer Network,后来有一篇变形Copy Network

Guided Attention

要求机器去领导attention的过程,使其有固定的方式进行。

Beam Search:集束搜索

对于目的和答案比较明确的任务,Beam Search比较有帮助。但是对于一些需要机器发挥“创造力”的任务,不太好用。在实践中,加入一些随机性(noise)可能结果会出乎意料的好。

遇到用optimization解决不了的问题,用RL(Reinforcement Learning)硬train一发就对了。把loss function当作是award,把你的decoder当作是Agent,是有可能可以做的。[1511.06732] Sequence Level Training with Recurrent Neural Networks (arxiv.org)